home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlb20 / lib / grp.c < prev    next >
C/C++ Source or Header  |  1991-10-20  |  3KB  |  171 lines

  1. /*
  2.  * Routines for reading information from /etc/group.
  3.  * Written by Eric Smith, based on Arnold Robbins' public domain
  4.  * getpwent routines (see getpw.c).
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <grp.h>
  12.  
  13. static char *grpfile = "/etc/group";    /* default group file */
  14. static FILE *fp;
  15.  
  16. static struct group curentry;        /* static data to return */
  17.  
  18. static int nextent __PROTO((void));
  19.  
  20. void setgrent ()
  21. {
  22.     if (fp)
  23.         rewind (fp);
  24.     else if ((fp = fopen (grpfile, "r")) == NULL)
  25.     {
  26. #ifdef VERBOSE
  27.         fprintf (stderr,
  28.             "setgrent: %s non-existant or unreadable.\n", grpfile);
  29. #endif
  30.     }
  31. }
  32.  
  33. void endgrent ()
  34. {
  35.     if (fp)
  36.     {
  37.         fclose (fp);
  38.         fp = NULL;
  39.     }
  40. }
  41.  
  42. struct group *getgrent ()
  43. {
  44.     if (!fp) setgrent();
  45.     if (!fp) return NULL;
  46.  
  47.     if (! nextent ())
  48.         return (NULL);
  49.     else
  50.         return (& curentry);
  51. }
  52.  
  53. struct group *getgrgid (gid)
  54.     int gid;
  55. {
  56.     setgrent();
  57.  
  58.     while (nextent ())
  59.         if (curentry.gr_gid == gid)
  60.             return (& curentry);
  61.  
  62.     return (NULL);
  63. }
  64.  
  65. struct group *getgrnam (name)
  66. register char *name;
  67. {
  68.     setgrent();
  69.  
  70.     while (nextent ())
  71.         if (strcmp (curentry.gr_name, name) == 0)
  72.             return (& curentry);
  73.  
  74.     return (NULL);
  75. }
  76.  
  77. #define MAX_MEMBERS 128        /* max. number of members in a group */
  78.  
  79. static char savbuf[512];
  80. static char *memb[MAX_MEMBERS];
  81.  
  82. static int nextent ()
  83. {
  84.     register char *cp;
  85.     register int i;
  86.  
  87.     if (!fp) setgrent();
  88.     if (!fp) return 0;
  89.  
  90.     if (fgets (savbuf, sizeof(savbuf), fp) != NULL)
  91.     {
  92.         for (cp = savbuf; *cp && *cp != ':'; cp++)
  93.             ;
  94.         curentry.gr_name = savbuf;
  95.         *cp++ = '\0';
  96.         curentry.gr_passwd = cp;
  97.         for (; *cp && *cp != ':'; cp++)
  98.             ;
  99.         *cp++ = '\0';
  100.         curentry.gr_gid = atoi (cp);
  101.         for (; *cp && *cp != ':'; cp++)
  102.             ;
  103.  
  104.         *cp++ = '\0';
  105.  
  106.         i = 0;
  107.         while( *cp ) {
  108.             if (i >= MAX_MEMBERS-1) break;
  109.             memb[i++] = cp;
  110.             for(; *cp && *cp != ',' && *cp != '\n'; cp++)
  111.                 ;
  112.             if (*cp == '\n')
  113.                 *cp = 0;
  114.             else if (*cp)
  115.                 *cp++ = 0;
  116.         }
  117.         memb[i] = NULL;
  118.         curentry.gr_mem = memb;
  119.         return (1);
  120.     }
  121.     return (0);
  122. }
  123.  
  124. #ifdef TEST
  125. int
  126. main (argc, argv)
  127. int argc;
  128. char **argv;
  129. {
  130.     struct group *gr;
  131.     char **m;
  132.  
  133.     if (argc > 1) {
  134.         grpfile = argv[1];
  135.     }
  136.  
  137.     setgrent ();
  138.     while ((gr = getgrent ()) != NULL)
  139.     {
  140.         printf ("%s:[%s] %d\n",
  141.             gr->gr_name,
  142.             gr->gr_passwd,
  143.             gr->gr_gid);
  144.         for (m = gr->gr_mem; *m; m++) {
  145.             printf("\t%s\n", *m);
  146.         }
  147.     }
  148.     endgrent ();
  149.  
  150.     if (gr = getgrnam ("mail")) {
  151.         printf ("%s:[%s] %d\n",
  152.             gr->gr_name,
  153.             gr->gr_passwd,
  154.             gr->gr_gid);
  155.         for (m = gr->gr_mem; *m; m++) {
  156.             printf("\t%s\n", *m);
  157.         }
  158.     }
  159.     if (gr = getgrgid (1)) {
  160.         printf ("%s:[%s] %d\n",
  161.             gr->gr_name,
  162.             gr->gr_passwd,
  163.             gr->gr_gid);
  164.         for (m = gr->gr_mem; *m; m++) {
  165.             printf("\t%s\n", *m);
  166.         }
  167.     }
  168.     return 0;
  169. }
  170. #endif
  171.